(function ($) {
    $.fn.extend({
        hoverZoom: function (settings) {

            var defaults = {
                overlay: true,
                overlayColor: '#2e9dbd',
                overlayOpacity: 0.7,
                zoom: 25,
                speed: 300
            };

            var settings = $.extend(defaults, settings);

            return this.each(function () {

                var s = settings;
                var hz = $(this);
                var image = $('img', hz);

                image.load(function () {

                    if (s.overlay === true) {
                        $(this).parent().append('<div class="zoomOverlay" />');
                        $(this).parent().find('.zoomOverlay').css({
                            opacity: 0,
                            display: 'block',
                            backgroundColor: s.overlayColor
                        });
                    }

                    var width = $(this).width();
                    var height = $(this).height();

                    $(this).fadeIn(1000, function () {
                        $(this).parent().css('background-image', 'none');
                        hz.hover(function () {
                            $('img', this).stop().animate({
                                height: height + s.zoom,
                                marginLeft: -(s.zoom),
                                marginTop: -(s.zoom)
                            }, s.speed);
                            if (s.overlay === true) {
                                $(this).parent().find('.zoomOverlay').stop().animate({
                                    opacity: s.overlayOpacity
                                }, s.speed);
                            }
                        }, function () {
                            $('img', this).stop().animate({
                                height: height,
                                marginLeft: 0,
                                marginTop: 0
                            }, s.speed);
                            if (s.overlay === true) {
                                $(this).parent().find('.zoomOverlay').stop().animate({
                                    opacity: 0
                                }, s.speed);
                            }
                        });
                    });
                });
                image.each(function () {
                    if (this.complete && image.css('display') === 'none') {
                        $(this).trigger('load');
                    }
                });
            });
        }
    });
})(jQuery);